package cool.lichuan.common.util;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cool.lichuan.common.domain.UserDetail;

import java.util.Optional;

/**
 * @author tenyears
 * @date 2021/7/21 14:23
 */
public class SaUtil {
    /**
     * 获取用户id
     *
     * @return 用户id
     */
    public static Long getUserId() {
        return StpUtil.getLoginIdAsLong();
    }

    /**
     * 获取用户名称
     *
     * @return 用户名称
     */
    public static String getUserName() {
        UserDetail loginUser = getLoginUser();
        return Optional.ofNullable(loginUser).map(UserDetail::getLoginName).orElse(null);
    }

    /**
     * 设置用户session
     *
     * @param user 用户信息
     */
    public static void setUserSession(UserDetail user) {
        setUserSession(LOGIN_USER_SESSION_KEY_PREFIX, user);
    }

    /**
     * 设置用户session
     * @param keyPrefix key
     * @param obj value
     */
    public static void setUserSession(String keyPrefix, Object obj) {
        String loginId = StpUtil.getLoginIdAsString();
        StpUtil.getSession().set(keyPrefix + loginId, obj);
    }

    /**
     * 从session中获取登录用户
     *
     * @return UserDetail
     */
    public static UserDetail getLoginUser() {
        String loginId = StpUtil.getLoginIdAsString();
        return StpUtil.getSession().get(LOGIN_USER_SESSION_KEY_PREFIX + loginId, new UserDetail());
    }

    /**
     * 判断用户是否为管理员
     *
     * @param userOrRoleId 用户ID或角色ID
     * @return boolean
     */
    public static boolean isAdmin(Long userOrRoleId) {
        return ObjectUtil.isNotNull(userOrRoleId) && 1L == userOrRoleId;
    }

    // **********  User-Session key集合 **********/
    /** 登陆用户信息 */
    public static final String LOGIN_USER_SESSION_KEY_PREFIX = "user:login:";
    /** 登陆用户角色信息 */
    public static final String LOGIN_USER_ROLE_IDS_SESSION_KEY_PREFIX = "user:role:";

    // **********  Custom-Session key集合 **********/
    /** 自定义角色session */
    public static final String CUSTOM_ROLE_SESSION_KEY_PREFIX = "custom:role";
    public static final String LOGIN_DEVICE_SYSTEM = "system";

    private SaUtil() {
    }
}
